import difflib
import re
import time
from urllib.parse import urlparse, parse_qsl, urljoin

from scrapy import Selector

from itkz.resources.utils import angle_brackets_util, html_clean_util


def trim_brackets(value):
    """
    去除括号、中括号（等） 及括号里面的内容
    """
    if value is None:
        return None
    return re.sub(u"\\(.*?\\)|\\{.*?\\}|\\[.*?\\]|\\<.*?\\>|【.*?】|（.*?）|（.*?\\)|\\(.*?）", "", value)


def get_html_tag(value):
    """
    从单个html片段中提取其标签名
    example：<span href="http://www.gov.cn/zhengce/zuixin.htm"></span>
    return： span
    """
    if value is None:
        return None
    result = re.search(r'<([a-zA-z]{1,10})', value, re.M | re.I)
    if result:
        return result.group(1)
    else:
        return None


def get_url_info(url):
    """获取url中的域名(host)、路径(path)、请求参数信息"""
    if not url:
        return {}

    if not str(url).startswith('http'):
        url = f'http://{url.strip()}'

    result = urlparse(url)
    item = dict(parse_qsl(result.query))
    item['host'] = result.netloc
    item['path'] = result.path
    if str(url).startswith('https'):
        item['scheme'] = 'https'
        item['home'] = 'https://{}'.format(item['host'])
    elif str(url).startswith('http'):
        item['scheme'] = 'http'
        item['home'] = 'http://{}'.format(item['host'])
    return item


def is_similar_url(url1, url2, step=-3):
    """
    判断两个链接的域名是否相似，截取域名进行判断
    :param url1:
    :param url2:
    :param step: 截取的下标值，默认-3, 从右往左截取3位
    :return:
    """
    u1 = get_url_info(url1).get('host') or ''
    u2 = get_url_info(url2).get('host') or ''

    u1_domain = '.'.join(u1.split('.')[step:])
    u2_domain = '.'.join(u2.split('.')[step:])
    similar_value = difflib.SequenceMatcher(None, u1_domain, u2_domain).quick_ratio()
    print("\n相似度判断：", similar_value, u1, u2, u1_domain, u2_domain)
    if similar_value < 0.9:
        print("不同域名", u1, u2, '\n')
        return False
    print("相同域名", u1, u2)
    return True


def is_equal_domain(url1, url2):
    """判断两个链接的域名是否相同"""
    url_home1 = get_url_info(url1).get('home') or ''
    url_home2 = get_url_info(url2).get('home') or ''
    return url_home1 == url_home2


def get_url_param(url, param_name):
    """获取url中参数信息"""
    if not url:
        return None
    result = urlparse(url)
    item = dict(parse_qsl(result.query))
    return item.get(param_name)


def trim_url(value):
    """
    针对url链接的一些格式化，
        遇到过某些页面取到的url带有\n、\t、空格等

    :param value: 传进来的是一个链接
    :return:
    """
    if not value:
        return value
    return trim_html(value).replace('\\n', '').replace('\\t', '').replace(' ', '')


def fix_url(value):
    """
    修复某些不合适的url
        例如：http://www.jckc.gov.cn/xxgk/xxgkyjx/ ../jdhy/rdhy_55867/ -》 http://www.jckc.gov.cn/jdhy/rdhy_55867/
        例如：http://xfb.beijing.gov.cn/\\n ./zwgkyxxgks/xxgk/zfxxgk/zfxxgkzn/202011/t20201117_2137983.html\\n -》 http://xfb.beijing.gov.cn/zwgkyxxgks/xxgk/zfxxgk/zfxxgkzn/202011/t20201117_2137983.html

    :param value: 这里首先要确保传进来的是一个链接
    :return:
    """
    if not value:
        return value
    if './' in value:
        point_index = index(value, '...../') or index(value, '..../') or index(value, '.../') or index(value, '../') or index(value, './')
        url_home = trim_url(value[:point_index]) or ''
        if not str(url_home).startswith('http'):
            url_home = f'http://{url_home}'
        url_path = trim_url(value[point_index:]) or ''
        return urljoin(url_home, url_path)
    else:
        return trim_url(value)


def index(value, key):
    try:
        return value.index(key)
    except:
        return 0


def trim_html(value):
    """提取html中的文本　"""
    if not value:
        return ""
    # return trim_html_save_line(value).replace('\n', '').strip()
    return re.sub(r'[\n\r ]', '', trim_html_save_line(value)).strip()


def trim_html_save_line(value):
    """提取html中的文本，保持换行的\n　"""
    if not value:
        return ""
    value = get_html_text_without_script(value)
    value = html_clean_util.replaceCharEntity(value)
    value = re.sub(r'[ |　|]', '', value)
    value = re.sub(r'\u3000\u0020\xa0', ' ', value) \
        .replace('\r', '\n') \
        .replace('<p>', '\n') \
        .replace('</p>', '\n') \
        .replace('<br>', '\n') \
        .replace('<br/>', '\n') \
        .replace(u'\u3000', u' ') \
        .replace(u'\u0020', ' ') \
        .replace(u'\u200b', u' ') \
        .replace(u'\xa0', u' ') \
        .replace('u3000', '') \
        .replace('u0020', '') \
        .replace('u200d', '') \
        .replace('xa0', '') \
        .replace("%0D%0A", '')
    return re.sub('\n+', '\n', value)


def get_html_text_without_script(value):
    """
        仅仅提取html中的内容（已去除script标签），没做特殊字符过滤或空格替换等操作

        避免尖括号中的中文或其他内容被替换掉，先查找所有<后面是数字或者中文的内容，将尖括号替换为特殊字符串，处理完毕后再替换回来。<中文或数字>
        例如：
            <td>省政府办公厅<1江海区老旧污水1管网排查4></td> => 省政府办公厅<江海区老旧污水1管网排查4>
    """
    if not value:
        return value
    value = angle_brackets_util.protect_angle_brackets(value)
    value = html_clean_util.clean_script(value)
    value = ''.join(Selector(text=value).xpath("//*/text()").extract())
    return angle_brackets_util.restore_angle_brackets(value)


def get_curr_time_str():
    """获取时间戳"""
    return str(time.time()).replace('.', '')[0:13]


def remove_bom(value):
    """查找包含BOM头的文件和清除BOM头"""
    value = trim_txt(value)
    return value.replace('\xef\xbb\xbf', '')\
        .replace('\n', '')\
        .replace('null', '\"\"')\
        .strip()


def trim_txt(value):
    """移除获取的文本中那些特殊字符"""
    if value is None:
        return None
    return value.replace(u'\u3000', u' ').replace(u'\u0020', ' ').replace(u'\xa0', u' ').replace(u'\u200b', u' ')


def strip(value):
    """移除 文本中的空格（中文空格/英文空格都清除） """
    if value is None:
        return None
    return value.replace(' ', '').replace('　', '').replace(' ', '').replace('', '').strip()


def trim_xiegan(value):
    """去除字符串中的斜杆"""
    if value is None:
        return None
    return str(value).replace('\\', '')


def html_encode(html):
    if html is None:
        return None
    return str(html)\
            .replace("'", '"') \
            .replace("@acute;", '"') \
            .replace('\n\r', '<br/>').replace('\\n\\r', '<br/>') \
            .replace('\n', '<br/>').replace('\\n', '<br/>') \
            .replace('\r', '<br/>').replace('\\r', '<br/>') \
            .replace('\xef\xbb\xbf', '').replace('\\xef\\xbb\\xbf', '') \
            .replace('\u3000', '').replace('\\u3000', '') \
            .replace('\xa0', '').replace('\\xa0', '') \
            .replace('@nbsp;', '') \
            .replace('\\', '') \
        # .replace('"', "@quot;") \
        # .replace("'", "''")


def clean_code_explain(value):
    """清除一般代码注释"""
    if not value:
        return value

    # 清除块级注释/** xx */
    m = re.compile(r'/[*].*?[*]/', re.S)
    value = re.sub(m, '', value)

    # 清除块级注释<!-- xx -->
    m = re.compile(r'<![-].*?[-]>', re.S)
    value = re.sub(m, '', value)

    # 清除 // 行级注释
    m = re.compile(r'//.*')
    value = re.sub(m, '', value)

    return value


def if_contain_chaos(keyword):
    """
    检测是否有乱码字符
    :param keyword:
    :return:
    """
    if not keyword:
        return False

    pattern = re.compile(u"[»¤Ê¿¸öÈËÄê¶È¼Æ»®°ì¹«ÊÒ¹¤×÷¼Æ»®Ñ§Ð£½ÌÑ§¼Æ»®Äê¶ÈÅàÑµ¼Æ»®Ó×¶ù´ó°à°²È«¹¤×÷¼Æ»®³öÄÉ¹¤×÷¼Æ»®²úÆÏúÊÛ¼Æ»®°àÖ÷ÈÎ¹¤×÷¼Æ»®Ñ§ÆÚ¼Æ»®Ó×¶ùÔ°Ó×¶ùµÂÓý¹¤×÷¼Æ»®¡¡±È¶ûmddot¸Ç´ÄÔøËµ£ºldquoÎ¢ÈíÊÇÒ»¼Ò¾­ÓªÏëÏóÁ¦µÄ¹«Ë¾¡£rdquoËäÈ»ÂôµÄÊÇ¼ÆËã»úÈí¼þ¼°Ïà¹Ø²úÆ£¬µ«ÒªÔÚÐÅÏ¢½çÒ»Âíµ±ÏÈ£¬¿¿µÄÊÇ²»¶Ï´´ÐÂ£¬¶øÒª´´ÐÂ£¬¾ÍÒªÏÈÓÐá¸»µÄÏëÏóÁ¦£¬ËùÒÔ¸Ç´ÄËµµÃÃ»´í£¬Î¢Èí¾­ÓªµÄµÄÈÊÇÏëÏóÁ¦¡£ÎªÁËÎüÊÕÄÜ²»¶Ï´´ÐÂµÄÒ»Á÷ÈË²Å£¬Î¢Èí¹«Ë¾³ýÁËËÄ´¦ÍÚ½ÇÍâ£¬Ò²¾­³£ÔÚÕÐÄ¼ÐÂ½øÔ±¹¤µÄ×îºóÃæÊÔÊ±£¬³öÒ»Ð©¹ÖÌâÀ´²âÊÔÓ¦Õ÷ÕßµÄ´´ÒâºÍÏëÏóÁ¦£¬Æ©ÈçldquoÎªÊ²Ã´ÏÂË®µÀ¾®µÄ¸Ç×ÓÊÇÔ²µÄrdquoldquoÄ¿Ç°ÊÀ½çÉÏÓÐ¶àÉÙ¸ö¸ÖÇÙµ÷ÒôÊ¦rdquoldquoÄãÄÜÎª¶úÁûµÄÈËÉè¼ÆÒ»¸öÄÖÖÓÂðrdquoldquoÄãÒªÈçºÎÒÆ¶¯¸»Ê¿É½rdquoµÈµÈ¡£ÒªÔÚ¶Ì¶ÌµÄ¼¸ÖÖÓÄÚ»Ø´ðÕâÀàÎÊÌâµÄÈ²»ÈÝÒ×£¬Ëü³ÉÁËÓ¦Õ÷Õß×î´óµÄÌôÕ½£¬»òÕßÃÎ÷Ê¡¡¡¡¡ÕâÐ©¹ÖÌâÓÐµÄÏñldquoÍÄÔµÄÌå²Ùrdquo£¬Æ©Èçldquo²»ÄÜ¹ý°õ£¬ÈçºÎ²âÁ¿Ò»¼ÜÅçÉä¿Í»úµÄÖØÁ¿rdquoÕâÏÔÈ»ÊÇÈý¹úÊ±´úldquo²Ü³å³Æ´óÏórdquoµÄÏÖ´ú°æ£¬Èç¹ûÄãÊÂÏÈ¿´¹ý£¬¾Í²»ÄÑÖªµÀ´ð°¸¡£µ«Ö÷ÊÔÕß²¢²»¼ûµÃÏ²»¶±ê×¼´ð°¸£¬Æ©Èç¶ÔldquoÎªÊ²Ã´ÏÂË®µÀ¾®µÄ¸Ç×ÓÊÇÔ²µÄrdquoÕâ¸öÌâÄ¿£¬Èç¹û»Ø´ðldquoÕâÑù¸Ç×Ó²Å²»»áÒòËÉÍÑ¶øµô½øÏÂË®µÀÀïrdquo£¬´ð°¸Ç³£ÕýÈ£¬µ«¿ÉÄÜÖ»ÓÐ¼°¸ñÖÊý£»Èç¹û»Ø´ðldquoÒòÎªÏÂË®µÀ¾®µÄ¿ÚÊÇÔ²µÄrdquo£¬Ö±½Ó¶øÃ÷ÁË£¬ÖÊý¿ÉÄÜ¸ßÒ»µã£¬Èç¹û»Ø´ðldquoÄãÏÈ»Ø´ðÎÒÎªÊ²Ã´ÏûÀ¶ÓÔ±µÄ±³´øÊÇºìÉ«µÄ£¬ÎÒ¾Í¸æËßÄã´ð°¸rdquo£¬¾ÙÒ»´Èý¡¢´¿ÍÎªÖ÷£¬ÖÊý¿ÉÄÜ»á¸ü¸ß¡£¡¡¡¡ÓÐÐ©ÌâÄ¿ÔòÃ»ÓÐÈËÖªµÀ´ð°¸¡¢µ½Ä¿Ç°»¹Ã»ÓÐ´ð°¸»ò¸ù±¾¾ÍÃ»ÓÐ´ð°¸£¬Æ©ÈçldquoÄ¿Ç°ÊÀ½çÉÏÓÐ¶àÉÙ¸ö¸ÖÇÙµ÷ÒôÊ¦rdquoldquoÒ»°ãËµÀ´£¬Âü¹þ¶ÙµÄµç»°²¾Òª­¶¯¼¸´Î²ÅÄÜÕÒµ½ÄãÒªÕÒµÄÈËÃûrdquoldquoÄãÒªÈçºÎÎªÖ»ÓÐÒ»Ö»ÊÖµÄÈËÉè¼Æ¼üÅÌrdquoldquoÄã»áÔõÑùÉè¼Æ±È¶ûmddot¸Ç´ÄµÄÔ¡ÊÒrdquoÎÊÕâÐ©ÎÊÌâ£¬Ö÷ÊÔÕßÏëÒªÁË½âµÄÆäÊµÊÇÓ¦Õ÷ÕßÅöµ½ÎÊÌâÊ±µÄ½â¾ö½Ê½¡£Æ©ÈçldquoÄ¿Ç°ÊÀ½çÉÏÓÐ¶àÉÙ¸ö¸ÖÇÙµ÷ÒôÊ¦rdquoÕâ¸öÎÊÌâ£¬ËüÃ»ÓÐÏÖ³ÉµÄ´ð°¸£¬ÖØµãÊÇÄãÒªÈçºÎÍÆÏëÈç¹ûÄãÄÜ¸ù¾ÝÈË¿Ú¡¢ÎÄ»¯¾­¼ÃË®Æ½£¬ÏÈ¹ÀËã³ö´ó¸ÅµÄ¸ÖÇÙÊýÁ¿£¬ÔÙ¼ÙÉèÃ¿¼Ü¸ÖÇÙ¶à¾Ãµ÷ÒôÒ»´Î£¬Ò»¸öµ÷ÒôÊ¦Ò»Äê¿Éµ÷¼¸¼Ü¸ÖÇÙ£¬ÄÇ¾Í¿ÉÒÔÍÆ¹Àµ÷ÒôÊ¦µÄÊýÁ¿¡£µ±È»£¬Äã¼ÙÉèµÄÊý¾Ý»ò±ÈÀýÒ²Ðí²»¶Ô£¬µ«ÔÚ½ÏòºÍ½¨ÉÏÔòÊÇ¿ÉÐÐµÄ£¬ÕâÑùÄãµÄÖÊýÓ¦¸Ã²»´í¡£¡¡¡¡ÓÐÈËÔø¾­ÎÊ¹ý±È¶ûmddot¸Ç´Ä£¬³öldquoÄãÒªÈçºÎÒÆ¶¯¸»Ê¿É½rdquoÕâÑùµÄ¹ÖÌâ£¬¾¿¾¹ÊÇÏëÑ°ÕÒÊ²Ã´ÑùµÄÈË²Å¸Ç´ÄµÄ»Ø´ðÊÇ£º¶ÔÕâÀàÎÊÌâ£¬Ó¦Õ÷ÕßÌá³öµÄ´ð°¸ÕýÈÓëñ²¢²»ÖØÒªÒòÎªÃ»ÓÐÕýÈ´ð°¸£¬ËûÃÇÒª¿´µÄÊÇÓ¦Õ÷ÕßÔÚÑ°ÕÒ´ð°¸Ê±£¬ÊÇñ¾ßÓÐÏëÏóÁ¦£¬ÓÖÊÇñÑ­×ÅÓÐÐ§µÄË¼¿¼½Ê½È¥Ë¼¿¼ÎÊÌâ¡£Æ©Èç²»¹ÜÄãÏëÓÃÊ²Ã´½¨À´ldquoÒÆ¶¯¸»Ê¿É½rdquo£¬Äã¶¼ÒªËµÃ÷ÄãÎªÊ²Ã´»áÏëµ½ÓÃÕâÖÖ½¨£¬ËüÔÚÂß¼­ÉÏÊÇñÕ¾µÃ×¡½ÅÄãÓÖÒªÈçºÎ½â¾ö¼¼ÊõÉÏµÄÎÊÌâµÈµÈ¡£Õâµ±È»±ÈldquoÓÞ¹«ÒÆÉ½rdquoÀ§ÄÑÐí¶à£¬µ«Î¢ÈíÒªµÄ²»ÊÇÕýÈ´ð°¸£¬¶øÊÇÒª¿´ÄãµÄÏëÏóÁ¦ºÍ´´Òâ£¬»¹ÓÐÄãµÄÏëÏóÁ¦ºÍ´´ÒâÊÇñ¾­µÃÆðÏÖÊµµÄ¿¼Ñé¡¡¡¡¡¿Æ»ÃÐ¡Ëµ±Ç×æ²¶ûÄÉËµ£ºldquoÖ»ÒªÒ»¸öÈËÄÜÏëÏóµÄ£¬¾ÍÓÐÁíÒ»¸öÈËÄÜ½«Ëü¸¶ÖîÊµÏÖ¡£rdquoµÄÈ£¬ÊÇÓÐÈËÏÈÏëÏóÈË¿ÉÒÔÔÚÌìÉÏÉ£¬È»ºóÓÐÈË¢Ã÷ÁËÉ»ú£¬ÈÃÈËÕæµÄ¿ÉÒÔÔÚÌìÉÏÉ£¬µ«ÕâÖÐ¼äÈ´Ïà²îÁËÊýÇ§Äê¡£ÈçºÎËõ¶ÌÏëÏóÓëÏÖÊµÖ®¼äµÄ²î¾à£¬¿ÉÄÜ±ÈÖ»ÓÐá¸»µÄÏëÏóÁ¦¸üÖØÒª£¬Ò²Ðí£¬ÕâÊÇÎ¢Èí¸üÖØÊÓµÄ£¬Ò²ÊÇËüÒ»Ö±ÄÜÁìÏÈÈºÂ×µÄ×î´óÔ­Òò¡£¶øÕâÆäÊµÒ²ÊÇÃ¿¸öÓÐÖ¾³ÉÎª´´ÔìÕßµÄÈË×îºÃµÄ×ÔÎÒ²âÊÔ£¬ÒªÊ¹´´Òâ³ÉÕæ£¬²»Ö»ÒªÓÐá¸»µÄÏëÏóÁ¦£¬¶øÇÒÒªÄÜÈÃÏëÏóÁ¦ÔÚÏÖÊµµÄÍÁÈÀÉÏÉú¸ù£¬½«À´²ÅÓÐ¿ª»¨½á¹ûµÄÒ»Ìì¡£]")
    match = pattern.search(keyword)
    if match:
        return True
    return False


def extract_first(str_lst):
    """
    获取一个字符串列表中第一个不为空的字符串
    :param str_lst:
    :return:
    """
    for v in str_lst or []:
        if not isinstance(v, str):
            continue
        v = re.sub('\n\r\t ', '', v)
        if v:
            return v
    return ''


def remove_error_char(v):
    """
    去除乱码
    :param v:
    :return:
    """
    v = v or ''
    v = re.sub(u"[»¤Ê¿¸öÈËÄê¶È¼Æ»®°ì¹«ÊÒ¹¤×÷¼Æ»®Ñ§Ð£½ÌÑ§¼Æ»®Äê¶ÈÅàÑµ¼Æ»®Ó×¶ù´ó°à°²È«¹¤×÷¼Æ»®³öÄÉ¹¤×÷¼Æ»®²úÆÏúÊÛ¼Æ»®°àÖ÷ÈÎ¹¤×÷¼Æ»®Ñ§ÆÚ¼Æ»®Ó×¶ùÔ°Ó×¶ùµÂÓý¹¤×÷¼Æ»®¡¡±È¶ûmddot¸Ç´ÄÔøËµ£ºldquoÎ¢ÈíÊÇÒ»¼Ò¾­ÓªÏëÏóÁ¦µÄ¹«Ë¾¡£rdquoËäÈ»ÂôµÄÊÇ¼ÆËã»úÈí¼þ¼°Ïà¹Ø²úÆ£¬µ«ÒªÔÚÐÅÏ¢½çÒ»Âíµ±ÏÈ£¬¿¿µÄÊÇ²»¶Ï´´ÐÂ£¬¶øÒª´´ÐÂ£¬¾ÍÒªÏÈÓÐá¸»µÄÏëÏóÁ¦£¬ËùÒÔ¸Ç´ÄËµµÃÃ»´í£¬Î¢Èí¾­ÓªµÄµÄÈÊÇÏëÏóÁ¦¡£ÎªÁËÎüÊÕÄÜ²»¶Ï´´ÐÂµÄÒ»Á÷ÈË²Å£¬Î¢Èí¹«Ë¾³ýÁËËÄ´¦ÍÚ½ÇÍâ£¬Ò²¾­³£ÔÚÕÐÄ¼ÐÂ½øÔ±¹¤µÄ×îºóÃæÊÔÊ±£¬³öÒ»Ð©¹ÖÌâÀ´²âÊÔÓ¦Õ÷ÕßµÄ´´ÒâºÍÏëÏóÁ¦£¬Æ©ÈçldquoÎªÊ²Ã´ÏÂË®µÀ¾®µÄ¸Ç×ÓÊÇÔ²µÄrdquoldquoÄ¿Ç°ÊÀ½çÉÏÓÐ¶àÉÙ¸ö¸ÖÇÙµ÷ÒôÊ¦rdquoldquoÄãÄÜÎª¶úÁûµÄÈËÉè¼ÆÒ»¸öÄÖÖÓÂðrdquoldquoÄãÒªÈçºÎÒÆ¶¯¸»Ê¿É½rdquoµÈµÈ¡£ÒªÔÚ¶Ì¶ÌµÄ¼¸ÖÖÓÄÚ»Ø´ðÕâÀàÎÊÌâµÄÈ²»ÈÝÒ×£¬Ëü³ÉÁËÓ¦Õ÷Õß×î´óµÄÌôÕ½£¬»òÕßÃÎ÷Ê¡¡¡¡¡ÕâÐ©¹ÖÌâÓÐµÄÏñldquoÍÄÔµÄÌå²Ùrdquo£¬Æ©Èçldquo²»ÄÜ¹ý°õ£¬ÈçºÎ²âÁ¿Ò»¼ÜÅçÉä¿Í»úµÄÖØÁ¿rdquoÕâÏÔÈ»ÊÇÈý¹úÊ±´úldquo²Ü³å³Æ´óÏórdquoµÄÏÖ´ú°æ£¬Èç¹ûÄãÊÂÏÈ¿´¹ý£¬¾Í²»ÄÑÖªµÀ´ð°¸¡£µ«Ö÷ÊÔÕß²¢²»¼ûµÃÏ²»¶±ê×¼´ð°¸£¬Æ©Èç¶ÔldquoÎªÊ²Ã´ÏÂË®µÀ¾®µÄ¸Ç×ÓÊÇÔ²µÄrdquoÕâ¸öÌâÄ¿£¬Èç¹û»Ø´ðldquoÕâÑù¸Ç×Ó²Å²»»áÒòËÉÍÑ¶øµô½øÏÂË®µÀÀïrdquo£¬´ð°¸Ç³£ÕýÈ£¬µ«¿ÉÄÜÖ»ÓÐ¼°¸ñÖÊý£»Èç¹û»Ø´ðldquoÒòÎªÏÂË®µÀ¾®µÄ¿ÚÊÇÔ²µÄrdquo£¬Ö±½Ó¶øÃ÷ÁË£¬ÖÊý¿ÉÄÜ¸ßÒ»µã£¬Èç¹û»Ø´ðldquoÄãÏÈ»Ø´ðÎÒÎªÊ²Ã´ÏûÀ¶ÓÔ±µÄ±³´øÊÇºìÉ«µÄ£¬ÎÒ¾Í¸æËßÄã´ð°¸rdquo£¬¾ÙÒ»´Èý¡¢´¿ÍÎªÖ÷£¬ÖÊý¿ÉÄÜ»á¸ü¸ß¡£¡¡¡¡ÓÐÐ©ÌâÄ¿ÔòÃ»ÓÐÈËÖªµÀ´ð°¸¡¢µ½Ä¿Ç°»¹Ã»ÓÐ´ð°¸»ò¸ù±¾¾ÍÃ»ÓÐ´ð°¸£¬Æ©ÈçldquoÄ¿Ç°ÊÀ½çÉÏÓÐ¶àÉÙ¸ö¸ÖÇÙµ÷ÒôÊ¦rdquoldquoÒ»°ãËµÀ´£¬Âü¹þ¶ÙµÄµç»°²¾Òª­¶¯¼¸´Î²ÅÄÜÕÒµ½ÄãÒªÕÒµÄÈËÃûrdquoldquoÄãÒªÈçºÎÎªÖ»ÓÐÒ»Ö»ÊÖµÄÈËÉè¼Æ¼üÅÌrdquoldquoÄã»áÔõÑùÉè¼Æ±È¶ûmddot¸Ç´ÄµÄÔ¡ÊÒrdquoÎÊÕâÐ©ÎÊÌâ£¬Ö÷ÊÔÕßÏëÒªÁË½âµÄÆäÊµÊÇÓ¦Õ÷ÕßÅöµ½ÎÊÌâÊ±µÄ½â¾ö½Ê½¡£Æ©ÈçldquoÄ¿Ç°ÊÀ½çÉÏÓÐ¶àÉÙ¸ö¸ÖÇÙµ÷ÒôÊ¦rdquoÕâ¸öÎÊÌâ£¬ËüÃ»ÓÐÏÖ³ÉµÄ´ð°¸£¬ÖØµãÊÇÄãÒªÈçºÎÍÆÏëÈç¹ûÄãÄÜ¸ù¾ÝÈË¿Ú¡¢ÎÄ»¯¾­¼ÃË®Æ½£¬ÏÈ¹ÀËã³ö´ó¸ÅµÄ¸ÖÇÙÊýÁ¿£¬ÔÙ¼ÙÉèÃ¿¼Ü¸ÖÇÙ¶à¾Ãµ÷ÒôÒ»´Î£¬Ò»¸öµ÷ÒôÊ¦Ò»Äê¿Éµ÷¼¸¼Ü¸ÖÇÙ£¬ÄÇ¾Í¿ÉÒÔÍÆ¹Àµ÷ÒôÊ¦µÄÊýÁ¿¡£µ±È»£¬Äã¼ÙÉèµÄÊý¾Ý»ò±ÈÀýÒ²Ðí²»¶Ô£¬µ«ÔÚ½ÏòºÍ½¨ÉÏÔòÊÇ¿ÉÐÐµÄ£¬ÕâÑùÄãµÄÖÊýÓ¦¸Ã²»´í¡£¡¡¡¡ÓÐÈËÔø¾­ÎÊ¹ý±È¶ûmddot¸Ç´Ä£¬³öldquoÄãÒªÈçºÎÒÆ¶¯¸»Ê¿É½rdquoÕâÑùµÄ¹ÖÌâ£¬¾¿¾¹ÊÇÏëÑ°ÕÒÊ²Ã´ÑùµÄÈË²Å¸Ç´ÄµÄ»Ø´ðÊÇ£º¶ÔÕâÀàÎÊÌâ£¬Ó¦Õ÷ÕßÌá³öµÄ´ð°¸ÕýÈÓëñ²¢²»ÖØÒªÒòÎªÃ»ÓÐÕýÈ´ð°¸£¬ËûÃÇÒª¿´µÄÊÇÓ¦Õ÷ÕßÔÚÑ°ÕÒ´ð°¸Ê±£¬ÊÇñ¾ßÓÐÏëÏóÁ¦£¬ÓÖÊÇñÑ­×ÅÓÐÐ§µÄË¼¿¼½Ê½È¥Ë¼¿¼ÎÊÌâ¡£Æ©Èç²»¹ÜÄãÏëÓÃÊ²Ã´½¨À´ldquoÒÆ¶¯¸»Ê¿É½rdquo£¬Äã¶¼ÒªËµÃ÷ÄãÎªÊ²Ã´»áÏëµ½ÓÃÕâÖÖ½¨£¬ËüÔÚÂß¼­ÉÏÊÇñÕ¾µÃ×¡½ÅÄãÓÖÒªÈçºÎ½â¾ö¼¼ÊõÉÏµÄÎÊÌâµÈµÈ¡£Õâµ±È»±ÈldquoÓÞ¹«ÒÆÉ½rdquoÀ§ÄÑÐí¶à£¬µ«Î¢ÈíÒªµÄ²»ÊÇÕýÈ´ð°¸£¬¶øÊÇÒª¿´ÄãµÄÏëÏóÁ¦ºÍ´´Òâ£¬»¹ÓÐÄãµÄÏëÏóÁ¦ºÍ´´ÒâÊÇñ¾­µÃÆðÏÖÊµµÄ¿¼Ñé¡¡¡¡¡¿Æ»ÃÐ¡Ëµ±Ç×æ²¶ûÄÉËµ£ºldquoÖ»ÒªÒ»¸öÈËÄÜÏëÏóµÄ£¬¾ÍÓÐÁíÒ»¸öÈËÄÜ½«Ëü¸¶ÖîÊµÏÖ¡£rdquoµÄÈ£¬ÊÇÓÐÈËÏÈÏëÏóÈË¿ÉÒÔÔÚÌìÉÏÉ£¬È»ºóÓÐÈË¢Ã÷ÁËÉ»ú£¬ÈÃÈËÕæµÄ¿ÉÒÔÔÚÌìÉÏÉ£¬µ«ÕâÖÐ¼äÈ´Ïà²îÁËÊýÇ§Äê¡£ÈçºÎËõ¶ÌÏëÏóÓëÏÖÊµÖ®¼äµÄ²î¾à£¬¿ÉÄÜ±ÈÖ»ÓÐá¸»µÄÏëÏóÁ¦¸üÖØÒª£¬Ò²Ðí£¬ÕâÊÇÎ¢Èí¸üÖØÊÓµÄ£¬Ò²ÊÇËüÒ»Ö±ÄÜÁìÏÈÈºÂ×µÄ×î´óÔ­Òò¡£¶øÕâÆäÊµÒ²ÊÇÃ¿¸öÓÐÖ¾³ÉÎª´´ÔìÕßµÄÈË×îºÃµÄ×ÔÎÒ²âÊÔ£¬ÒªÊ¹´´Òâ³ÉÕæ£¬²»Ö»ÒªÓÐá¸»µÄÏëÏóÁ¦£¬¶øÇÒÒªÄÜÈÃÏëÏóÁ¦ÔÚÏÖÊµµÄÍÁÈÀÉÏÉú¸ù£¬½«À´²ÅÓÐ¿ª»¨½á¹ûµÄÒ»Ìì¡£]", '', v)
    return v


def sql_value_filter(sql, max_length=None):
    """
    过滤sql操作的传值
    :param sql:
    :param max_length:
    :return:
    """
    dirty_stuff = ["\"", "\\", "/", "*", "'", "=", "-", "#", ";", "<", ">", "+", "%", "$", "(", ")", "%", "@", "!"]
    for stuff in dirty_stuff:
        sql = sql.replace(stuff, "")
    if max_length:
        return sql[:max_length]
    else:
        return sql
